Математическая среда Matlab. Основные возможности

Литература

1.         Есаян, А. Р. MATLAB: В 3 ч. / А. Р. Есаян, В. А. Панин, Н. М. Добровольский, Н. Н. Сергеев. – Тула: Изд-во Тул. гос. пед. ун-та им. Л. Н. Толстого, 2004.

Исторически MATLAB разрабатывался как диалоговая среда для матричных вычислений (MATrix LABoratory). Со временем пакет был оснащен хорошей графической системой, дополнен средствами компьютерной алгебры от Maple и усилен библиотеками команд (или Toolboxes), предназначенными для эффективной работы со специальными классами задач. Теперь MATLAB – мощный инструмент для проведения научных исследований.

Сегодня MATLAB фактически является стандартным расчетным средством и инструментом для многочисленных инженерных и технических разработок. Этому способствует богатая библиотека команд и свой язык программирования, дающий пользователю возможности автоматизации вычислений, в частности через добавление новых команд (функций) – m-файлов и подключение своих программ на языке С. В состав MATLAB входят интерпретатор команд, графическая оболочка, редактор-отладчик, профилер, библиотеки команд, компилятор, символьное ядро пакета Maple для проведения аналитических вычислений, математические библиотеки MATLAB на C/C++, Web-сервер, генератор отчетов и богатый инструментарий (Toolboxes). По-прежнему поддерживая диалоговый режим для простых вычислений, MATLAB превратился в среду программирования математических и инженерных задач, включая разработку сложных программ с развитым графическим интерфейсом.

Среда MATLAB включает интерпретатор команд на языке высокого уровня, графическую систему, пакеты расширений и реализована на языке С, MATLAB постоянно модернизируется, при этом расширяются возможности системы меню, совершенствуются старые и добавляются новые команды. Меню частично дублируют ряд команд и облегчают взаимодействие с многочисленными инструментами MATLAB. По-прежнему вся работа организуется через командное окно (Command Window), которое появляется при запуске программы matlab.exe. В процессе работы данные располагаются в памяти (Workspace) в виде матриц, создаются графические окна для изображения кривых, поверхностей и других графиков.

Командное окно Matlab

В командном окне в режиме диалога проводятся вычисления и активируются элементы среды MATLAB. Пользователь вводит команды или запускает на выполнение файлы с текстами на языке MATLAB. Интерпретатор обрабатывает введенное и выдает результаты; числовые и строковые данные, предупреждения и сообщения об ошибках.

Все расчеты в MATLAB выполняются с двойной точностью, а для представления чисел на экране имеются разные форматы. Нужный формат может быть определен в меню (File/Preferences) либо при помощи команды format. Существуют следующие способы представления чисел.

Таблица 1. Форматы вывода на экран.

Формат

Представление

short

Число отображается с 4 цифрами после десятичной точки или в формате short e

short e

Число в экспоненциальной форме с мантиссой из 5 цифр и показателем из 3 цифр

bank

Число с любым количеством чисел до десятичной точки и двумя цифрами после

rat

Представление в виде рационального дробного числа

long

Число с 16 десятичными цифрами

long e

Число в экспоненциальной форме с мантиссой из 16 цифр и показателем из 3 цифр

hex

Число в шестнадцатеричной форме

+

Символьное обозначение чисел (плюс – положительное число, минус – отрицательное и пробел для нуля)

  Дадим примеры вывода числа a=12.3456789 в различных форматах

>> format short, a

a =

   12.3457

>> format short e, a

a =

  1.2346e+001

Команда format + даёт компактный способ отображения структуры больших массивов. По умолчанию действует формат short и стиль loose, который добавляет пустые строки при выводе результата. Стиль compact подавляет вывод пустых строк. Команда format без параметров восстанавливает значения по умолчанию.

Синтаксис и данные

Переменные в MATLAB не нужно предварительно описывать, указывая их тип. Все данные хранятся в виде массивов: числовые переменные (внутренний тип numeriс), текстовые строки (char), ячейки (сеll) и структуры (struct), при помощи которых создаются пользовательские объекты (user object). Числовые массивы состоят из комплексных чисел с двойной точностью (тип double) и могут храниться целиком или в упакованном виде в случае разреженной матрицы (тип sparse). Двумерный массив – это матрица, одномерный – вектор, а скаляр – матрица размера 1x1,

Имя переменной должно начинаться с буквы, за ней могут идти буквы, цифры и символ подчеркивания. Допустимы имена любой длины, но MATLAB идентифицирует их по первым 31 символам и различает большие и малые буквы. В MATLAB имеется ряд констант.

Таблица 2. Зарезервированные имена констант.

Имя

Описание

ans

Результат последней операции

i, j

Мнимая единица

pi

Число p

eps

Машинная точность

realmax

Максимальное вещественное число

realmin

Минимальное вещественное число

inf

Бесконечность

NaN

Нечисловая переменная

end

Наибольшее значение индекса размерности массива

Отметим, что имя NaN (Not-a-Number) зарезервировано для результата операций 0/0, 0*inf, inf-inf и т.п.

Таблица 3. Специальные символы.

Символ

Назначение

[]

Квадратные скобки используются при задании матриц и векторов

 

Пробел служит для разделения элементов матриц

,

Запятая применяется для разделения элементов матриц и оператора в строке ввода

;

Точка с запятой отделяет строки матриц, а точка с запятой в конце оператора (команды) отменяет вывод результата на экран

:

Двоеточие используется для указания диапазона (интервала изменения величины) и в качестве знака групповой операции над элементами матриц

()

Круглые скобки применяются для задания порядка выполнения математических операций, а также для указания аргументов функций и индексов матриц

.

Точка отделяет дробную часть числа от целой его части, а также применяется в составе комбинированных знаков (.*, .^, ./, .\)

Три точки и более в конце строки отмечают продолжение выражения на следующей строчке

%

Знак процента означает начало комментария

!

Восклицательный знак означает начало команды MS DOS, например команда !dir выводит оглавление текущего каталога

Апостроф указывает на символьные строки, а для включения самого апострофа в символьную строку нужно поставить два апострофа подряд

Начнём с элементарных операций, чтобы проиллюстрировать интерактивный режим работы. Знаком (>>) в тексте будем помечать строки ввода команд MATLAB, а результат будет располагаться в последующих строках. Введём матрицу второго порядка и присвоим её переменной A:

>> A=[1 2; 3 4]

A =

     1     2

     3     4

Найдём обратную матрицу:

>> inv(A)

ans =

   -2.0000    1.0000

    1.5000   -0.5000

Поскольку не было указано, к чему относится результат последней операции, то MATLAB присвоил полученную квадратную матрицу стандартной переменной ans (сокращение от answer). Умножим обратную матрицу на квадрат матрицы A:

>> ans*A^2

ans =

     1     2

     3     4

Вычислим определитель матрицы A:

>> a=det(A)

a =

    -2

Чтобы посмотреть список используемых в текущем сеансе имён переменных, достаточно выполнить команду who. Команда whos выводит список переменных вместе с информацией о размерности, плотности заполнения и типе переменных:

>> whos

  Name      Size           Bytes  Class

  A         2x2               32  double array

  a         1x1                8  double array

  ans       2x2               32  double array

Grand total is 9 elements using 72 bytes

Те же вычисления можно выполнить, подготовив m-файл, называемый также файлом-сценарием или script-файлом, и запустив его на выполнение. Наберём в любом редакторе файл first.m следующего содержания:

A=[1 2: 3 4]

inv(A)

ans*A^2

a=det(A)

и поместим его в подкаталог MATLAB\work или \bin. Теперь в строке ввода наберём слово

>> first

В командном окне появится знакомые нам строки с результатами выполнения записанных в файле команд. Таким образом, в МATLAB можно приготовить файл с программой, протестировать его при помощи редактора-отладчика и выполнить, указав в строке ввода командного окна имя файла.

Задание матриц

По умолчанию все числовые переменные в MATLAB считаются матрицами с комплексными числами, так что скалярная величина есть матрица первого порядка, а векторы являются матрицами, состоящими из одного столбца или одной строки. Матрицу можно ввести, задав ее элементы или считав данные из файла, а также в результате обращения к стандартной или написанной пользователем функции. Элементы матрицы в пределах строки отделяются пробелами или запятыми, по­этому при задании числа в экспоненциальной форме (мантисса и порядок степени) никакие пробелы не допускаются. Матричные данные размещаются в памяти последовательно по столбцам.

Непосредственное задание матрицы можно осуществить несколькими способами. Например, вектор-столбец, то есть матрица, вторая размерность которой равна единице, может быть присвоена переменной А вводом одной строки:

>> A=[7e-6+5i; 4; 3.2e1] % Ввод вектора-столбца

A =

   0.0000 + 5.0000i

   4.0000         

  32.0000

или вводом нескольких строк

>> A = [   % ввод вектора по строкам

7e-6+5i

4

3.2e1];

В качестве примера задания вектора при помощи функций MATLAB приведём команды linspace и logspace. Они позволяют создавать векторы со значениями, меняющимися соответственно в арифметической и геометрической последовательности. Три параметра команды linspace задают соответственно первый и последний члены арифметической последовательности, а также число членов. Например:

>> linspace(1,-2,4)

ans =

     1     0    -1    -2

Параметры команды logspace задают соответственно десятичные порядки первого и последнего членов геометрической прогрессии, а также число членов. Например:

>> logspace(1,-1,5)

ans =

   10.0000    3.1623    1.0000    0.3162    0.1000

Векторы могут быть сформированы как диапазоны – при помощи двоеточий, разделяющих стартовое значение, шаг и предельное значение. Если величина шага отсутствует, то по умолчанию его значение равно единице.

n:m:k

В результате будет сформирован вектор, последний элемент которого не больше k для положительного шага m, и не меньше – для отрицательного:

[n,n+m,n+m+m,…]

Например:

>> a=1:-2:-4

a =

     1    -1    -3

Задание диапазона используется также при организации цикла.

Таблица 4. Функции описания матриц.

Имя

Назначение

eye

Единичная матрица

zeros

Нулевая матрица

ones

Матрица из единиц

rand

Случайная матрица со значениями из интервала [0,1]

hilb

Гильбертова матрица

magic

Матрица магического квадрата

diag

Создание диагональной матрицы или выделение диагонали

triu

Выделение верхней треугольной части матрицы

tril

Выделение нижней треугольной части матрицы

Обращение к элементу матрицы

Обращение к элементу матрицы производится по правилу, – в круглых скобках после имени матрицы даются индексы, которые должны быть положительными целыми числами. Например, А(2,1) означает элемент из второй строки первого столбца матрицы А. Для дальнейших примеров введем матрицу 2x2:

>> A=[1 2+5*i;4.6e-7 3];

Если в качестве индекса задать комплексное число с дробной вещественной частью, то MATLAB выведет предупреждение, отбросит мнимую составляющую, произведет округление дроби и попытается выполнить операцию:

>> A(3/2+4i)

Warning: Complex part of array subscript is ignored.

Warning: Subscript indices must be integer values.

ans =

  4.6000e-007

Данный пример показывает, что числа хранятся по столбцам и при обращении к данному двумерному массиву элемент А(2) есть то же самое, что и А(2,1). Чтобы изменить элемент матрицы, ему нужно присвоить новое значение:

>> A(2,3)=sin(1)  % Третий элемент второй строки

A =

   1.0000             2.0000 + 5.0000i        0

   0.0000             3.0000             0.8415

Заметим, что изначально матрица А состояла из двух строк и столбцов. Расширение матрицы (добавление третьего элемента во вторую строку) не потребовало никаких дополнительных действий, при этом третий элемент в первой строке был обнулен автоматически.

Размер матрицы можно уточнить по команде size, а результат команды size можно использовать для организации новой матрицы. Например, нулевая матрица того же порядка, что и матрица А, будет сформирована по команде

>> A2=zeros(size(A))

A2 =

     0     0     0

     0     0     0

Для преобразования матрицы в матрицу с другим числом строк и столбцов служит команда reshape

>> A3=reshape(A2,3,2)

A3 =

     0     0

     0     0

     0     0

С помощью двоеточия легко выделить часть матрицы. Например, вектор из первых двух элементов третьего столбца матрицы A задаётся выражением:

>> A(1:2,3)

ans =

         0

    0.8415

Двоеточие само по себе означает строку или столбец целиком. Работа с индексами в MATLAB очень удобна. Например, чтобы выделить несколько столбцов массива, достаточно организовать вектор из номеров столбцов. Это можно сделать явным перечислением, а можно указать нужный диапазон. Для выделения матрицы, составленной из нечетных столбцов матрицы А, используем команду

>> A(:,1:2:3)

ans =

    1.0000         0

    0.0000    0.8415

Здесь конструкция 1:2:3 означает изменение второго индекса от единицы до трех с шагом два. Двоеточие применяется также для замещения элементов матрицы. Следующая команда позволяет переставить первую и вторую строки матрицы А:

>> A([1,2],:)=A([2,1],:)

A =

   0.0000             3.0000             0.8415

   1.0000             2.0000 + 5.0000i        0

Здесь в качестве индекса выступают векторы [1,2] и [2,1]. Для удаления элемента вектора достаточно присвоить ему пустой массив – пару квадратных скобок []. Чтобы вычеркнуть одну или несколько строк (столбцов) матрицы нужно указать диапазон удаляемых строк (столбцов) для одной размерности и поставить двоеточие для другой размерности. Например, для удаления двух последних столбцов матрицы А достаточно ввести команду

>> A(:,2:end)=[]

A =

    0.0000

    1.0000

Обратим внимание, что вместо числового значения индекса указано зарезервированное имя end – максимальное значение индекса. В списке аргументов size второй параметр позволяет определить соответствующую размерность матрицы, например найти число столбцов матрицы. Для нахождения длины вектора можно воспользоваться также командой length. Число стол­бцов матрицы А2 равно 3, не зависимо от того, каким способом пользоваться:

>> [size(A2,2),length(A2(1,:))]

ans =

     3     3

Вместо двоеточия можно использовать функцию-синоним colon.

 

Арифметические операции

Набор арифметических операций в MATLAB состоит из стандартных операций сложения-вычитания, умножения-деления, операции возведения в степень и дополнены специальными матричными операциями. Если операция применяется к матрицам, размеры которых не согласованы, то будет выведено сообщение об ошибке. Для поэлементного выполнения операций умножения, деления и возведения в степень применяются комбинированные знаки (точка и знак операции). Например, если за матрицей стоит знак (^), то она возводится в степень, а комбинация (.^) означает возведение в степень каждого элемента матрицы. При умножении (сложении, вычитании, делении) матрицы на число соответствующая операция всегда производится поэлементно.

 

Таблица 5. Знаки операций.

Символ

Назначение

+,-

Символы плюс и минус обозначают знак числа или операцию сложения и вычитания матриц, причем матрицы должны быть одной размерности

*

Знак умножения обозначает матричное умножение; для поэлементного умножения матрицы применяется комбинированный знак (.*)

Апостроф обозначает операцию транспонирования (вместе с комплексным сопряжением); транспонирование без вычисления сопряжения обозначается при помощи комбинированного знака (.‘)

/

Левое деление

\

Правое деление

^

Оператор возведения в степень; для поэлементного возведения в степень применяется комбинированный знак (.^)

 

Проиллюстрируем различие обычного и поэлементного умножений при помощи следующего примера. Введём матрицу H размера 2х2 и матрицу O из единиц той же размерности:

>> H=[0 1; 2 3], O=ones(size(H))

H =

     0     1

     2     3

O =

     1     1

     1     1

Перемножим матрицы, используя обычное умножение:

>> H*O

ans =

     1     1

     5     5

Теперь применим поэлементную операцию:

>> H.*O

ans =

     0     1

     2     3

Понятно, что при поэлементном умножении вектора b=[1,2,3] на себя или при поэлементном возведении в квадрат результат получится одинаковым: [1 4 9]. Образуем матрицу умножением вектора столбца, полученного транспонированием из строки, на исходный вектор-строку:

>> C=b'*b

C =

     1     2     3

     2     4     6

     3     6     9

Прибавим к матрице С единичную матрицу той же размерности, умноженную на комплексное число p+i, и вычтем из полученного результата число 2:

>> D=C+(pi+i)*eye(size(C))-2

D =

   2.1416 + 1.0000i        0             1.0000         

        0             5.1416 + 1.0000i   4.0000         

   1.0000             4.0000            10.1416 + 1.0000i

Для вычитания числа из матрицы оно заменяется матрицей нужного размера, все элементы которой равны данному числу, а уже затем вычисляется разность матриц. Операция транспонирования для матрицы D дает следующий результат:

>> D'

ans =

   2.1416 - 1.0000i        0             1.0000         

        0             5.1416 - 1.0000i   4.0000         

   1.0000             4.0000            10.1416 - 1.0000i

Если при сложении и умножении размеры матриц не соответствуют, то будет выведено сообщение об ошибке. Например:

>> ones(2)*eye(3)

??? Error using ==> *

Inner matrix dimensions must agree.

Матричное левое деление может быть пояснено на примере системы линейных алгебраических уравнений Ах=B. Для ее решения достаточно набрать х=A\b. Соответственно для системы хА=b будет получено решение (если оно есть) при помощи операции правого деления x=b/A.

Представим пример для введенных ранее матрицы С и вектора b:

>> C/b

ans =

    1.0000

    2.0000

    3.0000

Логические операции

Операторы отношения и логические операторы, а также соответствующие им команды позволяют проводить сравнения массивов одинакового размера. Результатом таких операций являются матрицы из нулей и единиц, причем единица означает истинность, а нуль – ложь.

Таблица 6. Операции отношения.

Символ

Назначение

Имя функции

<

Меньше

lt

>=

Больше или равно

ge

>

Больше

gt

<=

Меньше или равно

le

==

Равно

eq

~=

Не равно

ne

 

При попытке сравнения векторов или матриц различной размерности будет выведено сообщение об ошибке. При сравнении скаляра с матрицей сначала из скалярной переменной создаётся матрица нужного размера, и уже затем происходит сравнение. Операции (==, ~=) проводят сравнение вещественных и мнимых частей комплексных чисел, а операции (>, <, >=, <=) – только вещественных частей.

Таблица 7. Логические операции.

Символ

Назначение

Имя функции

&

Логическое «и»

and

|

Логическое «или»

or

~

Отрицание

not

 

Исключающее «или»

xor

 

Для логических операций ненулевое число отождествляется с единицей. Приведём примеры:

>> a=[1 2;3 4] % ввод матрицы

a =

     1     2

     3     4

>> b=2 % ввод скаляра

b =

     2

>> c=a>b % результат сравнения - матрица

c =

     0     0

     1     1

>> a~=c % сравнение матриц - матрица

ans =

     1     1

     1     1

Логические операции можно записывать в виде функций. Так, последнее сравнение представимо в виде:

>> ne(a,c); % функция сравнения матриц